package juegocartas.mus;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author jbp
 */
class MotorMus implements ObservadorJugadorMus {
    private MesaMus mesa;    
    private final List<EventoMus> listaEventos = new ArrayList<EventoMus>();

    public MotorMus(MesaMus mesa) {
        this.mesa = mesa;
    }        
    
    public synchronized void agregarEvento(EventoMus evento) {
        listaEventos.add(evento);
    }
    
    public synchronized EventoMus tomarSiguienteEvento() {
        if (listaEventos.isEmpty()) {
            return null;
        }
        EventoMus evento = listaEventos.get(0);
        listaEventos.remove(0);
        return evento;
    }
    
    public void procesar() {
        EventoMus evento = tomarSiguienteEvento();
        while (evento != null) {
            procesarEvento(evento);
            evento = tomarSiguienteEvento();
        }
    }
    
    private void procesarEvento(EventoMus evento) {
        evento.ejecutar(mesa);
    }
    
    public void jugadorDiceMus(final JugadorMus jugador) {
        agregarEvento(new EventoMus() {
            public void ejecutar(MesaMus mesa) {
                mesa.getFase().jugadorDiceMus(jugador);
            }
        });
    }

    public void jugadorDiceCorto(final JugadorMus jugador) {
        agregarEvento(new EventoMus() {
            public void ejecutar(MesaMus mesa) {
                mesa.getFase().jugadorDiceCorto(jugador);
            }
        });
    }

    public void jugadorDescarta(final JugadorMus jugador, final List<Carta> descarte) {
        agregarEvento(new EventoMus() {
            public void ejecutar(MesaMus mesa) {
                mesa.getFase().jugadorDescarta(jugador, descarte);
            }
        });
    }

    public void jugadorDicePaso(final JugadorMus jugador) {
        agregarEvento(new EventoMus() {
            public void ejecutar(MesaMus mesa) {
                mesa.getFase().jugadorDicePaso(jugador);
            }
        });
    }

    public void jugadorDiceEnvido(final JugadorMus jugador, final int puntos) {
        agregarEvento(new EventoMus() {
            public void ejecutar(MesaMus mesa) {
                mesa.getFase().jugadorDiceEnvido(jugador, puntos);
            }
        });
    }

    public void jugadorDiceOrdago(final JugadorMus jugador) {
        agregarEvento(new EventoMus() {
            public void ejecutar(MesaMus mesa) {
                mesa.getFase().jugadorDiceOrdago(jugador);
            }
        });
    }

    public void jugadorDiceNoQuiero(final JugadorMus jugador) {
        agregarEvento(new EventoMus() {
            public void ejecutar(MesaMus mesa) {
                mesa.getFase().jugadorDiceNoQuiero(jugador);
            }
        });
    }

    public void jugadorDiceQuiero(final JugadorMus jugador) {
        agregarEvento(new EventoMus() {
            public void ejecutar(MesaMus mesa) {
                mesa.getFase().jugadorDiceQuiero(jugador);
            }
        });
    }
}
